﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using LM.InterfacesFabricas.Basicos.Enumeradores;
using LM.InterfacesFabricas.DTOs;
using LM.InterfacesFabricas.Excecoes;
using LM.InterfacesFabricas.Fabricas;
using LM.InterfacesFabricas.Interfaces.Servicos;
using NUnit.Framework;

namespace LM.TesteUnitario
{
    [TestFixture]
    class TestesServicoDeVaga
    {
        private IServicoDeVaga _servicoDeVaga;

        [SetUp]
        public void SetUp()
        {
            _servicoDeVaga = FabricaGenerica.Crie<IServicoDeVaga>();
        }

        [TestFixtureTearDown]
        public void TestFixtureTearDown()
        {
            LimpeDados();
        }

        [Test]
        public void TesteCadastreComSucesso()
        {
            LimpeDados();
            var dtoVaga = new DtoVaga { Codigo = 999, Numero = 999, TipoDeVaga = EnumTipoDeVaga.Coberta.ToString()};

            _servicoDeVaga.Cadastre(dtoVaga);
        }

        private void LimpeDados()
        {
            var vaga = _servicoDeVaga.Consulte(999);
            if (vaga != null)
            {
                _servicoDeVaga.Exclua(vaga.Codigo);
            }
        }

        [Test]
        [ExpectedException(typeof(InconsistenciasException))]
        public void TesteCadastreComInconsistencia()
        {
            var dtoVaga = new DtoVaga { Codigo = 1, Numero = 0, TipoDeVaga = ""};

            _servicoDeVaga.Cadastre(dtoVaga);
        }

        [Test]
        public void TesteAtualizeComSucesso()
        {
            LimpeDados();
            InicializeDados();

            var Vaga = _servicoDeVaga.Consulte(999);
            Vaga.Numero = 10;
            _servicoDeVaga.Atualize(Vaga);

            Vaga = _servicoDeVaga.Consulte(999);
            Assert.AreEqual(10, Vaga.Numero);
        }

        [Test]
        public void TesteExcluaComSucesso()
        {
            LimpeDados();
            InicializeDados();

            var Vaga = _servicoDeVaga.Consulte(999);
            Assert.IsNotNull(Vaga);
            Assert.AreEqual(999, Vaga.Codigo);

            _servicoDeVaga.Exclua(999);
            Vaga = _servicoDeVaga.Consulte(999);

            Assert.IsNull(Vaga);
        }

        [Test]
        public void TesteConsulteTodosComSucesso()
        {
            LimpeDados();
            InicializeDados();

            Assert.Greater(FabricaGenerica.Crie<IServicoDeVaga>().ConsulteTodos().Count, 0);
        }

        private void InicializeDados()
        {
            FabricaGenerica.Crie<IServicoDeVaga>().Cadastre(new DtoVaga
            {
                Codigo = 999,
                Numero = 1,
                TipoDeVaga = "Coberta"
            });
        }
    }
}
